home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
NeXTSTEP 3.3 (Developer)…68k, x86, SPARC, PA-RISC]
/
NeXTSTEP 3.3 Dev Intel.iso
/
NextDeveloper
/
Source
/
GNU
/
cc
/
rtf2ascii.c
< prev
next >
Wrap
Text File
|
1994-01-04
|
3KB
|
88 lines
// rtf2ascii.c
#import <libc.h>
#import <stdio.h>
#import <ctype.h>
#import <string.h>
#define ASCII_TERMINATOR '\0'
const char * rtfToAscii( const char *rtfTextPtr, int rtfTextLen, int * asciiTextLen )
{
char * asciiTextBuf = (char *) malloc(rtfTextLen); // should be plenty
char * asciiTextPtr = asciiTextBuf;
const char *endRtfPtr = rtfTextPtr + rtfTextLen;
if (!asciiTextBuf) // just in case
return NULL;
while ( rtfTextPtr != endRtfPtr ) {
switch( *rtfTextPtr ) {
case '\n':
rtfTextPtr++;
break;
case '}':
if ( *++rtfTextPtr == '\n' ) {
rtfTextPtr++;
if (*rtfTextPtr == '‹') rtfTextPtr++;
}
break;
case '{':
if ( !strncmp( rtfTextPtr, "{\\stylesheet", 12 )
|| !strncmp( rtfTextPtr, "{\\fonttbl", 9 )
|| !strncmp( rtfTextPtr, "{\\colortbl", 10 )
|| !strncmp( rtfTextPtr, "{\\NeXTHelp", 10 )
|| !strncmp( rtfTextPtr, "{{\\NeXTHelp", 11 ) ) {
int depth = 1;
while ( depth > 0 ) {
switch ( *++rtfTextPtr ) {
case '{': depth++; break;
case '}': depth--; break;
}
}
}
else
rtfTextPtr++;
break;
case '\\':
rtfTextPtr++;
if (*rtfTextPtr == '{'
|| *rtfTextPtr == '}'
|| *rtfTextPtr == '\\'
|| *rtfTextPtr == '\n' ) {
*asciiTextPtr++ = *rtfTextPtr++;
} else if ( *rtfTextPtr == '\'' ) {
int v1, v2, value;
rtfTextPtr++;
v1 = isdigit( *rtfTextPtr ) ? (*rtfTextPtr - '0')
: ((*rtfTextPtr - 'a') + 10);
rtfTextPtr++;
v2 = isdigit( *rtfTextPtr ) ? (*rtfTextPtr - '0')
: ((*rtfTextPtr - 'a') + 10);
value = (v1 << 4) | (v2);
*asciiTextPtr++ = value;
rtfTextPtr++;
} else {
while ( isalpha( *rtfTextPtr ) ) rtfTextPtr++;
if (*rtfTextPtr == '-') rtfTextPtr++;
while ( isdigit( *rtfTextPtr ) ) rtfTextPtr++;
if ( *rtfTextPtr == ' ' ) rtfTextPtr++;
else while (*rtfTextPtr == ' ') rtfTextPtr++;
}
break;
default:
*asciiTextPtr++ = *rtfTextPtr++;
}
}
*asciiTextPtr = ASCII_TERMINATOR;
*asciiTextLen = (int)asciiTextPtr - (int)asciiTextBuf;
#ifdef DEBUG
printf("Converting RTF buffer of size %d to ASCII buffer of size %d.\n",
rtfTextLen, *asciiTextLen);
#endif
return asciiTextBuf;
}